package main;

import java.awt.Point;
import java.util.ArrayList;
import java.util.List;

import main.api.GPSProblem;
import main.api.GPSState;
import main.impl.GPSProblemImpl;
import main.impl.GPSStateImpl;
import main.impl.TipoCosto;
import main.impl.TipoFicha;

public class App {

	public static void main(String[] args) {
	
		int dif = 1;
		SearchStrategy strategy = SearchStrategy.Greedy;
		String heu = "";
		TipoCosto costo = TipoCosto.CANTMOV;
		
		if(args.length != 4){
			System.out.println("Cantidad de par�metros inv�lida");
			return;
		}
			
		
		/*Dificultad-B�squeda-Heur�sticas-Costo-*/
		for(int i=0; i<args.length;i++){
			switch(i){
				case 0:/*Dificultad*/
						if(args[i].equals("Dif1"))
							dif = 1;
						else if(args[i].equals("Dif2"))
								dif = 2;
							 else if(args[i].equals("Dif3"))
									dif = 3;
							 	else{
							 		System.out.println("Error en la dificultad ingresada");
							 		return;
							 	} 
						break;
				case 1:/*M�todo de B�squeda*/
						if(args[i].equals("DFS"))
							strategy = SearchStrategy.DFS;
						else if(args[i].equals("ProfIter"))
							strategy = SearchStrategy.ProfIter;
							 else if(args[i].equals("Greedy"))
								 strategy = SearchStrategy.Greedy;
							 	else if(args[i].equals("AStar"))
							 		strategy = SearchStrategy.AStar;
							 		else if(args[i].equals("BFS"))
							 			strategy = SearchStrategy.BFS;
								 	else{
								 		System.out.println("Error en el m�todo de b�squeda ingresado");
								 		return;
								 	}
						break;
				
				case 2:/*Heur�stica*/
					if(args[i].equals("Man"))
						heu = "Man";
					else if(args[i].equals("DistFil"))
							heu = "DistFil";
					else if(args[i].equals("PiErr"))
				 				heu = "PiErr";
					 	else{
					 		System.out.println("Error en la heur�stica ingresada");
					 		return;
					 	} 
					break;
			
				case 3:/*Costo*/
					if(args[i].equals("CantMov"))
						costo = TipoCosto.CANTMOV;
					else if(args[i].equals("MovTam"))
						costo = TipoCosto.MOVTAM;
					 	else{
					 		System.out.println("Error en la funci�n de costo ingresada");
					 		return;
					 	} 
					break;		
						
			}
			
			
		}
		
		GPSProblem problem;
		GPSState goalState;
//		TipoFicha[][] estado = {{TipoFicha.rectv,TipoFicha.rectv,TipoFicha.nada,TipoFicha.rectv},
//				{TipoFicha.nada,TipoFicha.nada,TipoFicha.nada,TipoFicha.nada},
//				{TipoFicha.cuadradop,TipoFicha.cuadradop,TipoFicha.recth,TipoFicha.nada},
//				{TipoFicha.blanco1,TipoFicha.cuadradog,TipoFicha.nada,TipoFicha.cuadradop},
//				{TipoFicha.blanco2,TipoFicha.nada,TipoFicha.nada,TipoFicha.cuadradop}};
		TipoFicha[][] estado = {{TipoFicha.cualquiera, TipoFicha.cualquiera, TipoFicha.cualquiera, TipoFicha.cualquiera},
				{TipoFicha.cualquiera, TipoFicha.cualquiera, TipoFicha.cualquiera, TipoFicha.cualquiera},
				{TipoFicha.cualquiera, TipoFicha.cualquiera, TipoFicha.cualquiera, TipoFicha.cualquiera},
				{TipoFicha.cualquiera, TipoFicha.cuadradog, TipoFicha.nada, TipoFicha.cualquiera},
				{TipoFicha.cualquiera, TipoFicha.nada, TipoFicha.nada, TipoFicha.cualquiera}};
//		TipoFicha[][] estado = {{TipoFicha.cualquiera, TipoFicha.cualquiera, TipoFicha.cualquiera, TipoFicha.cualquiera},
//				{TipoFicha.cualquiera, TipoFicha.cualquiera, TipoFicha.cualquiera, TipoFicha.cualquiera},
//				{TipoFicha.cualquiera, TipoFicha.cualquiera, TipoFicha.cualquiera, TipoFicha.cualquiera},
//				{TipoFicha.cuadradog, TipoFicha.nada, TipoFicha.cuadradog, TipoFicha.nada},
//				{TipoFicha.nada, TipoFicha.nada, TipoFicha.nada, TipoFicha.nada}};
		
		goalState = new GPSStateImpl(estado,new Point(3, 0),new Point(4, 0));
		
		/*DEPENDE DE LA DIFICULTAD HAY QUE CARGAR DETERMINADO TABLERO*/
		GPSStateImpl initState;
		switch(dif){
		
		case 1: initState = new GPSStateImpl(1);
				break;
		case 2: initState = new GPSStateImpl(2);
			break;
		case 3: initState = new GPSStateImpl(3);
			break;
		default: initState = new GPSStateImpl(2);
			break;
			
		}
		
		problem = new GPSProblemImpl(initState, goalState, heu, costo);
		
		GPSEngine.engine(problem, strategy);
		
	}

}
